perm filename DSKFIL.MAC[GPR,LCS] blob sn#140133 filedate 1975-01-14 generic text, type T, neo UTF8
	TITLE	DSKFIL
	SUBTTL	MAIN ROUTINE
	A==1			;SCRATCH AC'S
	B==2
	C==3
	D==4
	CLUSTR==6		;NUMBER OF BLOCKS LEFT IN THIS CLUSTER HELD HERE
	T1==7			;AC TO HOLD RIB POINTER TO NEXT CLUSTER(S) OF FILE
	BLKNUM==16		;TELLS GETBLK WHICH BLOCK TO GET OFF THE DSK
	P==17			;PUSH DOWN STACK
	PDLEN==20		;ARBITRARY LENGTH OF PUSH DOWN STACK
;
	LOC	752		;LOCATION OF FIRST CONTROL WORD FOR DF10
	EXP	GETDAT		;TRANSFER TO LOCATION GETDAT FOR IOWD WORD(S)
;
	LOC	14000		;START OF PROGRAM ABOVE EDDT
START:	MOVE	A,116		;GET THE SYMBOL TABLE POINTER
	MOVEM	A,36		;AND MAKE IT AVAILABLE TO EDDT
	JRST	DDT##		;AND GO TO EDDT!
START2:	MOVE	P,[IOWD PDLEN,PDL];HERE TO START THE PRG. SET UP THE STACK
	PUSHJ	P,INITIA	;SETUP THE PI CHANNELS, CLEAR I/O, ETC....
	PUSHJ	P,GETHOM	;GET THE HOME BLOCK INFORMATION
	MOVE	BLKNUM,MFD	;GET THE LOGICAL BLOCK NUMBER OF [1,1]
	PUSHJ	P,GETRIB	;GET THE RIB
MORMFD:	PUSHJ	P,NXTBLK	;ADVANCE BLKNUM TO THE NEXT BLOCK OF [1,1]
	HALT	.		;END OF FILE.....ERROR!!!!
	PUSHJ	P,GETBLK	;GET THE BLOCK FROM THE DSK
	MOVEI	A,176		;SEARCH FOR [1,4] FROM BOTTOM UP
TRYSYS:	MOVE	C,BLOCK(A)	;GET A UFD NAME
	CAMN	C,[XWD 1,4]	;IS IT SYS?
	JRST	GOTSYS		;YES, GO LOOK FOR THE FILE IN [1,4].UFD
	SUBI	A,2		;NO, WE DON'T HAVE SYS, DECREMENT TO NEXT PPN
	JUMPGE	A,TRYSYS	;GO TRY AGAIN
	JRST	MORMFD		;NO MORE IN THIS BLOCK, GET THE NEXT ONE
GOTSYS:	HRRZ	BLKNUM,BLOCK+1(A);NOW, GET THE CLUSTER ADR TO THE RIB OF [1,4].UFD
	IMUL	BLKNUM,BPC	;TURN IT INTO A LOGICAL BLOCK NUMBER
	PUSHJ	P,GETRIB	;GET [1,4]'S RIB
	PUSHJ	P,NXTBLK	;GET THE NEXT BLOCK OF THE UFD
	HALT	.		;END OF FILE.....ERROR!!!!
	PUSHJ	P,GETBLK	;GET A BLOCK OF THE UFD
	MOVEI	A,176		;AND SEARCH IN THE SAME MANNER AS BEFORE FOR DTADIR.HLP
TRYRIB:	MOVE	C,BLOCK(A)	;GET THE FILE NAME
	CAMN	C,[SIXBIT/DTADIR/];IS IT DTADIR?
	JRST	TRYHLP		;YES, IS IT THE HELP FILE?
MORSYS:	SUBI	A,2		;NO DECREMENT TO THE NEXT FILE IN THE UFD
	JUMPGE	A,TRYRIB	;GO GET IT
	JRST	GOTSYS+3	;IN THIS CASE, GET ANOTHER BLOCK OF THE FILE
TRYHLP:	HLRZ	C,BLOCK+1(A)	;GET THE EXTENSION
	CAIE	C,'HLP'		;IS IT REALLY THE HELP FILE?
	JRST	MORSYS		;NO GET ANOTHER FILE
	HRRZ	BLKNUM,BLOCK+1(A);YES! GET THE CLUSTER ADR
	IMUL	BLKNUM,BPC	;CONVERT TO A BLOCK NUMBER
	PUSHJ	P,GETRIB	;AND GET ITS RIB
	PUSHJ	P,GETFIL	;NOW, READ THAT FILE!
	PUSHJ	P,PRINT		;AND PRINT IT ON THE LPT
	CONO	PI,400		;TURN OFF THE PI SYSTEM
	JRST	DDT		;AND GO TO EDDT
	SUBTTL	SUBROUTINES
INITIA:	MOVEI	B,41		;LOAD LOCATIONS 41 THROUGH 57 (PI CHANNELS) WITH HALTS
	MOVE	A,[HALT 57]	;GET THE HALT INSTRUCTION
	MOVEM	A,(A)		;PUT IT AWAY
	CAIE	B,(A)		;HAVE WE WRITTEN LOCATION 41 YET?
	SOJA	A,INITIA+2	;NO, GO WRITE ANOTHER LOCATION
	MOVE	A,[JSR DSKSER]	;SET UP PI CHANNEL 1 TO HANDLE DSK SERVICE
	MOVEM	A,42		;PUT THE JSR IN THE RIGHT PLACE
	CONO	APR,675550	;CLEAR ALL I/O DEVICES, AND ALL PARITY, NXM'S, ETC...
	CONO	PI,10000	;CLEAR THE PI SYSTEM
	CONO	DPC,175720	;CLEAR THE DSK PACK CONTROLLER (RP10)
	CONO	DPC,10		;CLEAR SOME MORE OF THE RP10
	CONO	DPC,1		;PUT THE RP10 ON PI CHANNEL 1
	CONO	PI,2300		;ACTIVATE THE PI SYSTEM
	POPJ	P,		;RETURN
;
GETHOM:	MOVEI	BLKNUM,1	;GET THE HOME BLOCK, READ IT FROM BLOCK 1
	PUSHJ	P,GETBLK	;GET THE BLOCK IN CORE
	MOVE	A,BLOCK+14	;GET THE NUMBER OF BLOCKS PER CLUSTER
	MOVEM	A,BPC		;AND SAVE IT
	MOVE	A,BLOCK+16	;GET THE NUMBER OF CLUSTERS PER UNIT
	MOVEM	A,CPU		;AND SAVE THAT TOO
	MOVE	A,BLOCK+20	;GET BYTE POINTER TO LOAD CLUSTER COUNT FROM RIB PNT.
	MOVEM	A,CLSCNT	;AND SAVE IT
	MOVE	A,BLOCK+20	;GET BYTE POINTER TO LOAD CLUSTER ADDRESS FROM RIB PNT.
	MOVEM	A,CLSADR	;AND SAVE THAT TOO
	MOVE	A,BLOCK+46	;GET LOGICAL BLOCK NUMBER OF THE MFD
	MOVEM	A,MFD		;AND ONCE AGAIN......SAVE IT!
	POPJ	P,		;RETURN
;
GETRIB:	PUSHJ	P,GETBLK	;GET THE RIB BLOCK
	HRRZ	T1,BLOCK	;GET INDEX INTO RIB TO GET RIB POINTERS TO THE FILE
	MOVE	T1,BLOCK(T1)	;GET THE FIRST POINTER TO THE FILE
	LDB	CLUSTR,CLSCNT	;GET THE NUMBER OF CLUSTERS IN THIS POINTER
	IMUL	CLUSTR,BPC	;AND CONVERT TO BLOCKS
	MOVNI	CLUSTR,-1(CLUSTR);AND PUT -(COUNT-1) IN THE COUNTER
	MOVE	A,BLOCK		;GET THE INDEX INTO THE RIB TO GET TO THE RIB POINTERS
	HRLI	B,BLOCK(A)	;GET THE ADR OF THE FIRST RIB
	HRRI	B,RIBPNT	;SO WE CAN BLT TO ANOTHER SECTION OF CORE
	HLRES	A		;GET COUNT OF NUMBER OF POINTERS IN A
	MOVNS	A		;MAKE IT POSITIVE!
	BLT	B,RIBPNT(A)	;AND BLT THOSE POINTERS AWAY!
	MOVEI	A,RIBPNT+2	;IGNORE THE FIRST 2 POINTERS, USE THE REST
	MOVEM	A,RIBCNT	;SAVE INDEX INTO RIBPNT
	POPJ	P,		;RETURN
;
GETFIL:	MOVE	C,BLOCK+5	;GET LENGTH OF FILE FROM RIB
	MOVEM	C,FILEN		;SAVE IT TO PRINT THE FILE
	MOVE	D,[IOWD 200,FILE];INITIAL CONTROL WORD FOR THE DF-10
	MOVEM	D,GETDAT	;MAKE IT AVAILABLE TO THE DF-10
GETFL2:	PUSHJ	P,NXTBLK	;GET BLOCK OF FILE
	POPJ	P,		;END OF FILE, RETURN
	PUSHJ	P,DATIN		;GET THE BLOCK OF THE FILE
	MOVEI	D,200		;ADD ONE BLOCK OF WORDS TO THE DF-10 IOWD
	ADDM	D,GETDAT	;ADD IT
	JRST	GETFL2		;AND GET THE NEXT BLOCK OF THE FILE
;
NXTBLK:	AOJG	CLUSTR,NXTCLS	;HAVE WE FINISHED READING FROM THIS CLUSTER?
	ADDI	BLKNUM,1	;NO, INCREASE THE BLOCK NUMBER BY ONE
	AOS	(P)		;GIVE A SKIP RETURN
	POPJ	P,		;AND RETURN
NXTCLS:	MOVE	T1,@RIBCNT	;GET THE NEXT RIB POINTER
	JUMPE	T1,[POPJ P,]	;NON-SKIP RETURN IF DONE (EOF)
	LDB	CLUSTR,CLSCNT	;GET THE CLUSTER COUNT OUT OF THE POINTER
	JUMPE	CLUSTR,NEWUNI	;IF ZERO, THIS IS A CHANGE OF UNIT POINTER
	IMUL	CLUSTR,BPC	;CONVERT TO BLOCKS
	MOVNI	CLUSTR,-1(CLUSTR);AND PUT -(COUNT-1) IN COUNTER
	LDB	BLKNUM,CLSADR	;GET CLUSTER ADDRESS
	IMUL	BLKNUM,BPC	;CONVERT TO A LOGICAL BLOCK NUMBER
	AOS	RIBCNT		;UPDATE THE RIB INDEX
	JRST	NXTBLK+2	;AND GIVE A SKIP RETURN
NEWUNI:	AOS	RIBCNT		;NEW UNIT, IGNORE IT IN THIS PROGRAM
	JRST	NXTCLS		;AND GET THE NEXT RIB POINTER
;
PRINT:	MOVN	A,FILEN		;FORM AOBJN WORD TO READ ALL THE FILE WORD BY WORD
	HRLZS	A		;PUT NEGITIVE COUNT IN LEFT HALF, ZERO IN RIGHT HALF
	MOVE	B,FILE(A)	;GET A WORD
	CONSZ	LPT,200		;IS THE LPT READY FOR ANOTHER WORD?
	JRST	.-1		;NO, LET'S WAIT
	DATAO	LPT,B		;YES, PRINT IT
	AOBJN	A,PRINT+2	;GO FOR MORE
	POPJ	P,		;RETURN
;
GETBLK:	MOVE	A,[IOWD 200,BLOCK];GET IOWD WORD TO READ ONE BLOCK INTO LOC BLOCK
	MOVEM	A,GETDAT	;AND TELL THE DF-10 ABOUT IT
DATIN:	MOVE	A,BLKNUM	;GET THE BLOCK NUMBER TO FIND THE PROPER CYLINDER
	IDIVI	A,↑D200		;GET THE CYLINDER
	LSH	A,↑D22		;PUT IT IN THE RIGHT PLACE FOR A DATAO
	MOVEM	A,D		;SAVE IT FOR LATER
	TLO	A,400000	;FUNCTION 4 = POSTION HEADS
	DATAO	DPC,A		;TELL THE RP-10 WHAT WE WANT DONE
	AOJA	.		;AND WAIT
	MOVE	A,BLKNUM	;NOW, FORM THE SURFACE AND SECTOR ADDRESS
	IDIVI	A,↑D20		;20 SURFACES PER CYLINDER
	IDIVI	B,↑D10		;10 SECTORS PER SURFACE
	LSH	B,↑D17		;SHIFT SURFACE ADR OVER INTO POSTION
	ADD	D,B		;ADD IT TO THE CYLINDER ADR
	LSH	C,↑D12		;SHIFT SECTOR ADR OVER INTO POSTION
	ADDI	D,752(C)	;ADD THAT PLUS THE ADR OF THE INITIAL CONTROL WORD ADR
	DATAO	DPC,D		;READ CODE=0
	AOJA	.		;WAIT FOR DSK TO RESPOND
	POPJ	P,		;RETURN
;
;
DSKSER:	Z			;HERE ON PI CHANNEL 1 INTERRUPT
	CONI	DPC,A		;GET STATUS BITS OF RP-10
	TRNE	A,377700	;ANY ERRORS?
	HALT	.		;YES....(MY FANTASTIC ERROR RECOVORY...LIKE IT?)
	DATAI	DPC,A		;GET STATUS BITS OF DRIVES
	TLNE	A,114		;ANY ERRORS?
	HALT	.		;YUP!!!
	CONO	DPC,10		;CLEAR DONE
	DATAO	DPC,[XWD 500000,776];GIVE AN AT EASE, CLEARING THE INTERRUPT
	AOS	DSKSER		;GIVE SKIP RETURN-THEREBY SKIPING OVER NULL JOB
	CONO	DPC,1		;PUT DPC ON PI CHANNEL 1
	JEN	@DSKSER		;CLEAR PI INTERRUPT AND RETURN
;
;
PDL:	BLOCK	PDLEN		;PUSH DOWN STACK
BPC:	Z			;BLOCKS PER CLUSTER
CPU:	Z			;CLUSTERS PER UNIT
CLSCNT:	Z			;BYTE POINTER TO GET CLUSTER COUNT (HOME BLOCK)
CLSADR:	Z			;BYTE POINTER TO GET CLUSTER ADR (HOME BLOCK)
MFD:	Z			;BLOCK NUMBER OF MFD BEGINNING
RIBCNT:	Z			;INDEX INTO RIBPNT
RIBPNT:	BLOCK	150		;RIB POINTERS FROM RIB STORED HERE
FILEN:	Z			;LENGTH OF FILE WE'RE READING
FILE:	BLOCK	20*200		;AREA TO STORE FILE IN CORE
GETDAT:	BLOCK	3		;IOWD WORD(S) FOR DF-10
PATCH:	BLOCK	2000		;PATCH AREA
BLOCK:	BLOCK	200		;AREA TO READ IN A BLOCK OF THE DSK
	END	START